package lab03.test06;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.*;

public class Test06 {
    public static void main(String[] args) {
//        6、	使用RandomAccessFile流统计一篇英文中的单词，要求如下：
//      （1）一共出现了多少个英文单词。
//      （2）有多少个互不相同的单词。
//      （3）给出每个单词出现的频率，并将这些单词按频率大小顺序进行打印。

        RandomAccessFile randomAccessFile = null;
        Map<String,Integer> map = new HashMap<String, Integer>();
        List<Map.Entry<String, Integer>> list = null;
        String path = "D:\\words.txt";
        try {

//            'r':以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
//            "rw":打开以便读取和写入。如果该文件尚不存在，则尝试创建该文件。
//            "rws":打开以便读取和写入，对于 "rw"，还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
//            "rwd":打开以便读取和写入，对于 "rw"，还要求对文件内容的每个更新都同步写入到底层存储设备。

            randomAccessFile = new RandomAccessFile(path,"r");
            String line = null;

            int count = 0;
            while ((line = randomAccessFile.readLine()) != null){
                //统计单词的个数
                count += 1;

//                有多少个互不相同的单词。
                if (map.get(line) == null){
                    map.put(line,1);
                }else {

//                    方法get(Object key)返回与给定“键”相关联的“值”。
//                    int value = map.get(line);
//                    value += 1;
//                    map.put(line,value);

                    map.put(line,map.get(line) + 1);
                }

//                给出每个单词出现的频率，并将这些单词按频率大小顺序进行打印。

//                Comparator可以对集合对象或者数组进行排序的比较器接口，
//                实现该接口的public compare(T o1,To2)方法即可实现排序，
//                该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。

                list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
                Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){

                    @Override
                    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                        int t =  - o1.getValue().compareTo(o2.getValue());
                        if(t == 0)
                            return o1.getKey().compareTo(o2.getKey());
                        return t;
                    }

                });



            }
            System.out.println("总共出现了：" + count + "个单词。");
            System.out.println("总共有" + map.size() + "个不同的单词。");
            for (Map.Entry<String,Integer> entry : list){
                System.out.println(entry.getKey() + "\t\t" + entry.getValue());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                randomAccessFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
